<!DOCTYPE html>
<html lang="zh-CN">
  <head>
  <meta charset="UTF-8">
  <meta 
    name="viewport"
    content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
  <meta 
    http-equiv="X-UA-Compatible" 
    content="ie=edge">
  <meta 
    name="theme-color" 
    content="#fff" 
    id="theme-color">
  <meta 
    name="description" 
    content="hexoDemo用于介绍如何使用hexo">
  <link 
    rel="icon" 
    href="/">
  <title>04-静态资源优化</title>
  
    
      <meta 
        property="og:title" 
        content="04-静态资源优化">
    
    
      <meta 
        property="og:url" 
        content="https://zwl5670.gitee.io/2014/08/01/14-%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/04-%E9%9D%99%E6%80%81%E8%B5%84%E6%BA%90%E4%BC%98%E5%8C%96/index.html">
    
    
      <meta 
        property="og:img" 
        content="https://img.songhn.com/img/Y67gdd.png">
    
    
      <meta 
        property="og:img" 
        content="hexoDemo用于介绍如何使用hexo">
    
    
      <meta 
        property="og:type" 
        content="article">
      <meta 
        property="og:article:published_time" 
        content="2014-08-01">
      <meta 
        property="og:article:modified_time" 
        content="2023-03-14">
      <meta 
        property="og:article:author" 
        content="zwl5670">
      
        
          <meta 
            property="og:article:tag" 
            content="性能优化">
        
      
    
  
  
  <link rel="preload" href="//at.alicdn.com/t/font_1946621_i1kgafibvw.css" as="style" >
  <link rel="preload" href="//at.alicdn.com/t/font_1952792_89b4ac4k4up.css" as="style" >
  <link rel="preload" href="/css/main.css" as="style" >
  
  <link rel="modulepreload" href="//instant.page/5.1.0">
  
  <link rel="stylesheet" href="/css/main.css">
  
  <link rel="stylesheet" href="//at.alicdn.com/t/font_1946621_i1kgafibvw.css">
  
  <link rel="stylesheet" href="//at.alicdn.com/t/font_1952792_89b4ac4k4up.css">
  
  
  
    <link rel="stylesheet" href="/js/lib/lightbox/baguetteBox.min.css">
  
  <script>
    function loadScript(url, cb) {
      var script = document.createElement('script');
      script.src = url;
      if (cb) script.onload = cb;
      script.async = true;
      document.body.appendChild(script);
    }
    function loadCSS(href, data, attr) {
      var sheet = document.createElement('link');
      sheet.ref = 'stylesheet';
      sheet.href = href;
      sheet.dataset[data] = attr;
      document.head.appendChild(sheet);
    }
    function changeCSS(cssFile, data, attr) {
      var oldlink = document.querySelector(data);
      var newlink = document.createElement("link");
      newlink.setAttribute("rel", "stylesheet");
      newlink.setAttribute("href", cssFile);
      newlink.dataset.prism = attr;
      document.head.replaceChild(newlink, oldlink);
    }
  </script>
  
    
  
  <script>
    // control reverse button
    var reverseDarkList = {
      dark: 'light',
      light: 'dark'
    };
    var themeColor = {
      dark: '#1c1c1e',
      light: '#fff'
    }
    // get the data of css prefers-color-scheme
    var getCssMediaQuery = function() {
      return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
    };
    // reverse current darkmode setting function
    var reverseDarkModeSetting = function() {
      var setting = localStorage.getItem('user-color-scheme');
      if(reverseDarkList[setting]) {
        setting = reverseDarkList[setting];
      } else if(setting === null) {
        setting = reverseDarkList[getCssMediaQuery()];
      } else {
        return;
      }
      localStorage.setItem('user-color-scheme', setting);
      return setting;
    };
    // apply current darkmode setting
  </script>
  
    <script>
      var setDarkmode = function(mode) {
      var setting = mode || localStorage.getItem('user-color-scheme');
      if(setting === getCssMediaQuery()) {
        document.documentElement.removeAttribute('data-user-color-scheme');
        localStorage.removeItem('user-color-scheme');
        document.getElementById('theme-color').content = themeColor[setting];
        document.getElementById('theme-color').dataset.mode = setting;
      } else if(reverseDarkList[setting]) {
        document.documentElement.setAttribute('data-user-color-scheme', setting);
        document.getElementById('theme-color').content = themeColor[setting];
        document.getElementById('theme-color').dataset.mode = setting;
      } else {
        document.documentElement.removeAttribute('data-user-color-scheme');
        localStorage.removeItem('user-color-scheme');
        document.getElementById('theme-color').content = themeColor[getCssMediaQuery()];
        document.getElementById('theme-color').dataset.mode = getCssMediaQuery();
      }
    };
    setDarkmode();
    </script>
  
  
  
    <link rel="preload" href="/js/lib/lightbox/baguetteBox.min.js" as="script">
    <link rel="preload" href="/js/lib/lightbox/baguetteBox.min.css" as="style" >
  
  
    <link rel="preload" href="/js/lib/lozad.min.js" as="script">
  
  
  
  
  
  
<meta name="generator" content="Hexo 6.3.0"></head>

  <body>
    <div class="wrapper">
       
      <nav class="navbar">
  <div class="navbar-logo">
    <a class="navbar-logo-main" href="/">
      
      <span class="navbar-logo-dsc">前端面试</span>
      </a>
  </div>
  <div class="navbar-menu">
    
      <a 
        href="/" 
        class="navbar-menu-item">
        
          首页
        
      </a>
    
      <a 
        href="/archives" 
        class="navbar-menu-item">
        
          归档
        
      </a>
    
      <a 
        href="/tags" 
        class="navbar-menu-item">
        
          标签
        
      </a>
    
      <a 
        href="/categories" 
        class="navbar-menu-item">
        
          分类
        
      </a>
    
      <a 
        href="/about" 
        class="navbar-menu-item">
        
          关于
        
      </a>
    
      <a 
        href="/links" 
        class="navbar-menu-item">
        
          友链
        
      </a>
    
    <button 
      class="navbar-menu-item darknavbar navbar-menu-btn" 
      aria-label="Toggle dark mode"
      id="dark">
      <i class="iconfont icon-weather"></i>
    </button>
    <button 
      class="navbar-menu-item searchnavbar navbar-menu-btn" 
      aria-label="Toggle search"
      id="search">
      <!-- <i 
        class="iconfont icon-search" 
        style="font-size: 1.2rem; font-weight: 400;">
      </i> -->
      <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img"
        class="iconify iconify--ion" width="28" height="28" preserveAspectRatio="xMidYMid meet" viewBox="0 0 512 512">
        <path fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="28"
          d="M256 80a176 176 0 1 0 176 176A176 176 0 0 0 256 80Z"></path>
        <path fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="28"
          d="M232 160a72 72 0 1 0 72 72a72 72 0 0 0-72-72Z"></path>
        <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="28"
          d="M283.64 283.64L336 336"></path>
      </svg>
    </button>
  </div>
</nav> 
      
      <div 
        id="local-search" 
        style="display: none">
        <input
          class="navbar-menu-item"
          id="search-input"
          placeholder="请输入搜索内容..." />
        <div id="search-content"></div>
      </div>
      
      <div class="section-wrap">
        <div class="container">
          <div class="columns">
            <aside class="left-column">
              
              <div class="card card-author">
                
  <img 
    src="https://img.songhn.com/img/Y67gdd.png" 
    class="author-img"
    width="88"
    height="88"
    alt="author avatar">

<p class="author-name">zwl5670</p>
<p class="author-description">前端学习资料</p>
<div class="author-message">
  <a 
    class="author-posts-count" 
    href="/archives">
    <span>215</span>
    <span>文章</span>
  </a>
  <a 
    class="author-categories-count" 
    href="/categories">
    <span>14</span>
    <span>分类</span>
  </a>
  <a 
    class="author-tags-count" 
    href="/tags">
    <span>14</span>
    <span>标签</span>
  </a>
</div>

              </div>
               <div class="sticky-tablet">
  
  
    <article class="display-when-two-columns spacer">
      <div class="card card-content toc-card">
        <div class="toc-header">
  <i 
    class="iconfont icon-menu" 
    style="padding-right: 2px;">
  </i>目录
</div>
<ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F%E5%92%8C%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF"><span class="toc-text">图片格式和应用场景</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#JPEG-%E6%A0%BC%E5%BC%8F"><span class="toc-text">JPEG 格式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#PNG-%E6%A0%BC%E5%BC%8F"><span class="toc-text">PNG 格式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#GIF-%E6%A0%BC%E5%BC%8F"><span class="toc-text">GIF 格式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Webp-%E6%A0%BC%E5%BC%8F"><span class="toc-text">Webp 格式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%80%BB%E7%BB%93"><span class="toc-text">总结</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%9B%BE%E7%89%87%E4%BC%98%E5%8C%96%E7%9A%84%E5%B8%B8%E8%A7%81%E6%96%B9%E6%B3%95"><span class="toc-text">图片优化的常见方法</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1%E3%80%81%E7%94%A8%E5%B7%A5%E5%85%B7%E5%8E%8B%E7%BC%A9%E5%9B%BE%E7%89%87"><span class="toc-text">1、用工具压缩图片</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#2%E3%80%81%E5%B0%86%E5%9B%BE%E7%89%87%E5%B0%BA%E5%AF%B8%E8%B7%9F%E9%9A%8F%E7%BD%91%E7%BB%9C%E7%8E%AF%E5%A2%83%E8%BF%9B%E8%A1%8C%E5%8F%98%E5%8C%96"><span class="toc-text">2、将图片尺寸跟随网络环境进行变化</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#3%E3%80%81%E5%93%8D%E5%BA%94%E5%BC%8F%E5%9B%BE%E7%89%87"><span class="toc-text">3、响应式图片</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#4%E3%80%81%E9%80%90%E6%AD%A5%E5%8A%A0%E8%BD%BD%E5%9B%BE%E5%83%8F%EF%BC%9Alazyload%E3%80%81LQIP%E3%80%81LQIP"><span class="toc-text">4、逐步加载图像：lazyload、LQIP、LQIP</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5%E3%80%81%E9%9B%AA%E7%A2%A7%E5%9B%BE%EF%BC%88Image-spriting%EF%BC%89"><span class="toc-text">5、雪碧图（Image spriting）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#6%E3%80%81%E6%9C%89%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8B%EF%BC%8C%E5%B9%B6%E4%B8%8D%E9%9C%80%E8%A6%81%E5%9B%BE%E7%89%87%E6%96%87%E4%BB%B6"><span class="toc-text">6、有些场景下，并不需要图片文件</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#7%E3%80%81%E5%9C%A8%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E8%BF%9B%E8%A1%8C%E5%9B%BE%E7%89%87%E8%87%AA%E5%8A%A8%E4%BC%98%E5%8C%96"><span class="toc-text">7、在服务器端进行图片自动优化</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#HTML%E4%BC%98%E5%8C%96"><span class="toc-text">HTML优化</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1%E3%80%81%E7%B2%BE%E7%AE%80-HTML-%E4%BB%A3%E7%A0%81"><span class="toc-text">1、精简 HTML 代码</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#2%E3%80%81%E6%96%87%E4%BB%B6%E6%94%BE%E5%9C%A8%E5%90%88%E9%80%82%E4%BD%8D%E7%BD%AE"><span class="toc-text">2、文件放在合适位置</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#4%E3%80%81%E5%A2%9E%E5%BC%BA%E7%94%A8%E6%88%B7%E4%BD%93%E9%AA%8C"><span class="toc-text">4、增强用户体验</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#CSS%E4%BC%98%E5%8C%96"><span class="toc-text">CSS优化</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1%E3%80%81%E6%8F%90%E5%8D%87-CSS-%E6%B8%B2%E6%9F%93%E6%80%A7%E8%83%BD"><span class="toc-text">1、提升 CSS 渲染性能</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#2%E3%80%81%E5%90%88%E9%80%82%E4%BD%BF%E7%94%A8-CSS-%E9%80%89%E6%8B%A9%E5%99%A8"><span class="toc-text">2、合适使用 CSS 选择器</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#3%E3%80%81%E6%8F%90%E5%8D%87-CSS-%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E6%80%A7%E8%83%BD"><span class="toc-text">3、提升 CSS 文件加载性能</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#4%E3%80%81%E7%B2%BE%E7%AE%80-CSS-%E4%BB%A3%E7%A0%81"><span class="toc-text">4、精简 CSS 代码</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5%E3%80%81%E5%90%88%E7%90%86%E4%BD%BF%E7%94%A8-Web-Fonts"><span class="toc-text">5、合理使用 Web Fonts</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#6%E3%80%81CSS-%E5%8A%A8%E7%94%BB%E4%BC%98%E5%8C%96"><span class="toc-text">6、CSS 动画优化</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#JavaScript-%E6%80%BB%E4%BD%93%E4%BC%98%E5%8C%96"><span class="toc-text">JavaScript 总体优化</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%8F%90%E5%8D%87-JavaScript-%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E6%80%A7%E8%83%BD"><span class="toc-text">提升 JavaScript 文件加载性能</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#JavaScript-%E5%8F%98%E9%87%8F%E5%92%8C%E5%87%BD%E6%95%B0%E4%BC%98%E5%8C%96"><span class="toc-text">JavaScript 变量和函数优化</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#JavaScript-%E5%8A%A8%E7%94%BB%E4%BC%98%E5%8C%96"><span class="toc-text">JavaScript 动画优化</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%90%88%E7%90%86%E4%BD%BF%E7%94%A8%E7%BC%93%E5%AD%98"><span class="toc-text">合理使用缓存</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#JavaScript-%E7%BC%93%E5%AD%98%E4%BC%98%E5%8C%96"><span class="toc-text">JavaScript 缓存优化</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#Cookie"><span class="toc-text">Cookie</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#sessionStorage"><span class="toc-text">sessionStorage</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#LocalStorage"><span class="toc-text">LocalStorage</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#IndexedDB"><span class="toc-text">IndexedDB</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#JavaScript-%E6%A8%A1%E5%9D%97%E5%8C%96%E5%8A%A0%E8%BD%BD%E6%96%B9%E6%A1%88%E5%92%8C%E9%80%89%E5%9E%8B"><span class="toc-text">JavaScript 模块化加载方案和选型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%87%8F%E5%B0%91%E5%9B%9E%E6%B5%81%E5%92%8C%E9%87%8D%E7%BB%98%E9%87%8D%E8%A6%81%E4%B8%BE%E6%8E%AA"><span class="toc-text">减少回流和重绘重要举措</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#CSS"><span class="toc-text">CSS</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#JavaScript"><span class="toc-text">JavaScript</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#DOM-%E7%BC%96%E7%A8%8B%E4%BC%98%E5%8C%96%E7%9A%84%E2%BD%85%E5%BC%8F%E6%96%B9%E6%B3%95"><span class="toc-text">DOM 编程优化的⽅式方法</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%8E%A7%E5%88%B6-DOM-%E5%A4%A7%E5%B0%8F"><span class="toc-text">控制 DOM 大小</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%AE%80%E5%8C%96-DOM-%E6%93%8D%E4%BD%9C"><span class="toc-text">简化 DOM 操作</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E9%9D%99%E6%80%81%E6%96%87%E4%BB%B6%E5%8E%8B%E7%BC%A9%E5%B7%A5%E5%85%B7%E4%BB%8B%E7%BB%8D"><span class="toc-text">静态文件压缩工具介绍</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E9%9D%99%E6%80%81%E2%BD%82%E6%96%87%E4%BB%B6%E6%89%93%E5%8C%85%E2%BD%85%E6%96%B9%E6%A1%88"><span class="toc-text">静态⽂文件打包⽅方案</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E9%9D%99%E6%80%81%E2%BD%82%E6%96%87%E4%BB%B6%E7%89%88%E6%9C%AC%E5%8F%B7%E6%9B%B4%E6%96%B0%E7%AD%96%E7%95%A5"><span class="toc-text">静态⽂文件版本号更新策略</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%89%8D%E7%AB%AF%E6%9E%84%E5%BB%BA%E5%B7%A5%E5%85%B7%E4%BB%8B%E7%BB%8D%E5%92%8C%E9%80%89%E5%9E%8B%E5%BB%BA%E8%AE%AE"><span class="toc-text">前端构建工具介绍和选型建议</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%B8%B8%E7%94%A8%E6%9E%84%E5%BB%BA%E5%B7%A5%E5%85%B7"><span class="toc-text">常用构建工具</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#webpack-%E6%89%93%E5%8C%85%E4%BC%98%E5%8C%96"><span class="toc-text">webpack 打包优化</span></a></li></ol></li></ol>
      </div>
    </article>
  
  
  <article class="card card-content categories-widget">
    <div class="categories-card">
  <div class="categories-header">
    <i 
      class="iconfont icon-fenlei" 
      style="padding-right: 2px;">
    </i>分类
  </div>
  <div class="categories-list">
    
      <a href="/categories/%E5%89%8D%E7%AB%AF%E5%B7%A5%E5%85%B7/">
        <div class="categories-list-item">
          前端工具
          <span class="categories-list-item-badge">13</span>
        </div>
      </a>
    
      <a href="/categories/CSS%E5%9F%BA%E7%A1%80/">
        <div class="categories-list-item">
          CSS基础
          <span class="categories-list-item-badge">18</span>
        </div>
      </a>
    
      <a href="/categories/CSS%E8%BF%9B%E9%98%B6/">
        <div class="categories-list-item">
          CSS进阶
          <span class="categories-list-item-badge">9</span>
        </div>
      </a>
    
      <a href="/categories/HTML/">
        <div class="categories-list-item">
          HTML
          <span class="categories-list-item-badge">12</span>
        </div>
      </a>
    
      <a href="/categories/JS%E5%9F%BA%E7%A1%80/">
        <div class="categories-list-item">
          JS基础
          <span class="categories-list-item-badge">56</span>
        </div>
      </a>
    
      <a href="/categories/JS%E5%9F%BA%E7%A1%80ES6/">
        <div class="categories-list-item">
          JS基础ES6
          <span class="categories-list-item-badge">10</span>
        </div>
      </a>
    
      <a href="/categories/JS%E5%9F%BA%E7%A1%80%E5%BC%82%E6%AD%A5/">
        <div class="categories-list-item">
          JS基础异步
          <span class="categories-list-item-badge">11</span>
        </div>
      </a>
    
      <a href="/categories/JS%E8%BF%9B%E9%98%B6/">
        <div class="categories-list-item">
          JS进阶
          <span class="categories-list-item-badge">11</span>
        </div>
      </a>
    
      <a href="/categories/%E7%A7%BB%E5%8A%A8web/">
        <div class="categories-list-item">
          移动web
          <span class="categories-list-item-badge">3</span>
        </div>
      </a>
    
      <a href="/categories/CSS%E5%92%8CDOM/">
        <div class="categories-list-item">
          CSS和DOM
          <span class="categories-list-item-badge">6</span>
        </div>
      </a>
    
      <a href="/categories/Node/">
        <div class="categories-list-item">
          Node
          <span class="categories-list-item-badge">16</span>
        </div>
      </a>
    
      <a href="/categories/Vue%E5%9F%BA%E7%A1%80/">
        <div class="categories-list-item">
          Vue基础
          <span class="categories-list-item-badge">15</span>
        </div>
      </a>
    
      <a href="/categories/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/">
        <div class="categories-list-item">
          性能优化
          <span class="categories-list-item-badge">7</span>
        </div>
      </a>
    
      <a href="/categories/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%8C%96/">
        <div class="categories-list-item">
          前端工程化
          <span class="categories-list-item-badge">8</span>
        </div>
      </a>
    
  </div>
</div>
  </article>
  
  <article class="card card-content tags-widget">
    <div class="tags-card">
  <div class="tags-header">
    <i 
      class="iconfont icon-biaoqian" 
      style="padding-right: 2px;">
    </i>热门标签
  </div>
  <div class="tags-list">
    
      <a 
        href="/tags/JS%E5%9F%BA%E7%A1%80/" 
        title="JS基础">
        <div class="tags-list-item">JS基础</div>
      </a>
    
      <a 
        href="/tags/CSS%E5%9F%BA%E7%A1%80/" 
        title="CSS基础">
        <div class="tags-list-item">CSS基础</div>
      </a>
    
      <a 
        href="/tags/Node/" 
        title="Node">
        <div class="tags-list-item">Node</div>
      </a>
    
      <a 
        href="/tags/Vue%E5%9F%BA%E7%A1%80/" 
        title="Vue基础">
        <div class="tags-list-item">Vue基础</div>
      </a>
    
      <a 
        href="/tags/%E5%89%8D%E7%AB%AF%E5%B7%A5%E5%85%B7/" 
        title="前端工具">
        <div class="tags-list-item">前端工具</div>
      </a>
    
      <a 
        href="/tags/HTML/" 
        title="HTML">
        <div class="tags-list-item">HTML</div>
      </a>
    
      <a 
        href="/tags/JS%E8%BF%9B%E9%98%B6/" 
        title="JS进阶">
        <div class="tags-list-item">JS进阶</div>
      </a>
    
      <a 
        href="/tags/JS%E5%9F%BA%E7%A1%80%E5%BC%82%E6%AD%A5/" 
        title="JS基础异步">
        <div class="tags-list-item">JS基础异步</div>
      </a>
    
      <a 
        href="/tags/JS%E5%9F%BA%E7%A1%80ES6/" 
        title="JS基础ES6">
        <div class="tags-list-item">JS基础ES6</div>
      </a>
    
      <a 
        href="/tags/CSS%E8%BF%9B%E9%98%B6/" 
        title="CSS进阶">
        <div class="tags-list-item">CSS进阶</div>
      </a>
    
      <a 
        href="/tags/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%8C%96/" 
        title="前端工程化">
        <div class="tags-list-item">前端工程化</div>
      </a>
    
      <a 
        href="/tags/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/" 
        title="性能优化">
        <div class="tags-list-item">性能优化</div>
      </a>
    
      <a 
        href="/tags/CSS%E5%92%8CDOM/" 
        title="CSS和DOM">
        <div class="tags-list-item">CSS和DOM</div>
      </a>
    
      <a 
        href="/tags/%E7%A7%BB%E5%8A%A8web/" 
        title="移动web">
        <div class="tags-list-item">移动web</div>
      </a>
    
  </div>
</div>
  </article>
  
  
</div>
            </aside>
            <main class="main-column">
              
<article class="card card-content">
  <header>
    <h1 class="post-title">
      04-静态资源优化
    </h1>
  </header>
  <div class="post-meta post-show-meta">
    <time datetime="2014-07-31T16:00:00.000Z">
      <i 
        class="iconfont icon-calendar" 
        style="margin-right: 2px;">
      </i>
      <span>2014-08-01</span>
    </time>
    
      <span class="dot"></span>
      
        <a 
          href="/categories/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/" 
          class="post-meta-link">
          性能优化
        </a>
      
    
    
      <span class="dot"></span>
      <span>4.4k 字</span>
    
  </div>
  
    <div 
      class="post-meta post-show-meta" 
      style="margin-top: -10px;">
      <div style="display: flex; align-items: center;">
        <i 
          class="iconfont icon-biaoqian" 
          style="margin-right: 2px; font-size: 1.15rem;">
        </i>
        
          
          <a 
            href="/tags/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/" 
            class="post-meta-link">
            性能优化
          </a>
        
      </div>
    </div>
  
  </header>
  <div 
    id="section" 
    class="post-content">
    <p><ArticleTopAd></ArticleTopAd></p>
<h2 id="图片格式和应用场景"><a href="#图片格式和应用场景" class="headerlink" title="图片格式和应用场景"></a>图片格式和应用场景</h2><h3 id="JPEG-格式"><a href="#JPEG-格式" class="headerlink" title="JPEG 格式"></a>JPEG 格式</h3><p>JPEG（Joint Photographic Experts Group）是一种针对彩色照片而广泛使用的有损压缩图形格式，属于位图。</p>
<p>常用文件扩展名为<code>.jpg</code>，也有 <code>.jpeg</code>和<code>.jpe</code>。JPEG 在互联网上常被应用于存储和传输照片。</p>
<ul>
<li><p>适合：颜色丰富的照片、彩色图大焦点图、通栏 banner 图；结构不规则的图形。</p>
</li>
<li><p>不适合：线条图形和文字、图标图形，因为它的压缩算法不太这些类型的图形；并且不支持透明度。</p>
</li>
</ul>
<h3 id="PNG-格式"><a href="#PNG-格式" class="headerlink" title="PNG 格式"></a>PNG 格式</h3><p>PNG（Portable Network Graphics）是一种无损压缩的位图图形格式，支持索引、灰度、RGB 三种颜色方案以及 Alpha 通道等特性。</p>
<p>PNG 最初是作为替代 GIF 来设计的，能够显示 256 色，文件比 JPEG 或者 GIF 大，但是 PNG 非常好的保留了图像质量。支持 Alpha 通道的半透明和透明特性。最高支持 24 位彩色图像（PNG-24）和 8 位灰度图像（PNG-8）。</p>
<ul>
<li><p>适合：纯色、<strong>透明</strong>、线条绘图，图标；边缘清晰、有大块相同颜色区域；需要带<strong>半透明</strong>的图片。</p>
</li>
<li><p>适合：由于是无损存储，所以不太适合体积太大的彩色图像</p>
</li>
</ul>
<p>比如说，如果你需要带透明背景的图片，此时就可以用 png 格式的图。</p>
<h3 id="GIF-格式"><a href="#GIF-格式" class="headerlink" title="GIF 格式"></a>GIF 格式</h3><p>GIF（Graphics Interchange Format）是一种位图图形格式，以 8 位色（即 256 种颜色）重现真彩色的图像，采用 LZW 压缩算法进行编码。</p>
<p>支持 256 色；仅支持完全透明和完全不透明；如果需要带动画效果的图片，GIF 是比较通用的选择。</p>
<ul>
<li><p>适合：动画，图标。</p>
</li>
<li><p>不适合：每个像素只有 8 比特，不适合存储彩色图片。</p>
</li>
</ul>
<h3 id="Webp-格式"><a href="#Webp-格式" class="headerlink" title="Webp 格式"></a>Webp 格式</h3><p>Webp 是一种现代图像格式，可为图像提供无损压缩和有损压缩，这使得它非常灵活。由 Google 在购买 On2 Technologies 后发展出来，以 BSD 授权条款发布。</p>
<p>Webp的优秀算法能同时保证图像质量和较小体积；可以插入多帧，实现动画效果；可以设置透明度；采用 8 位压缩算法。</p>
<p>无损的 Webp 比 PNG 小 26%，有损的 Webp 比 JPEG 小 25-34％，比 GIF 有更好的动画。</p>
<ul>
<li>适合：适用于图形和半透明图像。</li>
</ul>
<h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><ul>
<li><p>banner图、大图，可以用 jpg、webp格式。</p>
</li>
<li><p>图标、带透明背景的图，可以用 png 格式。</p>
</li>
<li><p>带动画效果的图，可以用 gif 格式。</p>
</li>
</ul>
<h2 id="图片优化的常见方法"><a href="#图片优化的常见方法" class="headerlink" title="图片优化的常见方法"></a>图片优化的常见方法</h2><h3 id="1、用工具压缩图片"><a href="#1、用工具压缩图片" class="headerlink" title="1、用工具压缩图片"></a>1、用工具压缩图片</h3><p><strong>压缩 PNG 图片</strong>：</p>
<ul>
<li><p>工具：<a target="_blank" rel="noopener" href="https://www.npmjs.com/package/node-pngquant-native">node-pngquant-native</a></p>
</li>
<li><p>介绍：跨平台、压缩比特别高，压缩png24非常好。</p>
</li>
</ul>
<p>安装方法：</p>
<pre class="highlight"><span class="line">npm install node-pngquant-native</span><br></pre>

<p><strong>压缩 JPEG 图片</strong>：</p>
<ul>
<li><p>工具：<a target="_blank" rel="noopener" href="https://www.npmjs.com/package/jpegtran">jpegtran</a></p>
</li>
<li><p>官网：<a target="_blank" rel="noopener" href="https://www.npmjs.com/package/jpegtran">https://www.npmjs.com/package/jpegtran</a></p>
</li>
<li><p>介绍：跨平台，但压缩的比率只有80-90%。</p>
</li>
</ul>
<p>安装方法：</p>
<pre class="highlight"><span class="line">npm install –g jpegtran</span><br></pre>

<p>使用方法：</p>
<pre class="highlight"><span class="line">jpegtran -copy none -optimize -outfile output_file.jpg input_file.jpg</span><br></pre>

<p><strong>压缩 GIF 图</strong>：</p>
<ul>
<li><p>工具：Gifsicle</p>
</li>
<li><p>官网（含安装方法）：<a target="_blank" rel="noopener" href="https://www.lcdf.org/gifsicle/">https://www.lcdf.org/gifsicle/</a></p>
</li>
<li><p>介绍：Gifsicle 通过改变每帧比例，减小 gif文件大小，同时可以使用透明来达到更小的文件大小，是目前公认的最好的解决方案。</p>
</li>
</ul>
<p>使用方法：</p>
<pre class="highlight"><span class="line"><span class="comment"># 压缩命令。注意，这里是将压缩级别设置为3。如果将压缩级别设置为1或者2，则基本不压缩。</span></span><br><span class="line">gifsicle --optimize=3 -o out_file.gif in_file.gif</span><br><span class="line"></span><br><span class="line"><span class="comment"># 裁掉透明部分</span></span><br><span class="line">gifsicle --optimize=3 --crop-transparency -o out_file.gif in_file.gif</span><br></pre>

<h3 id="2、将图片尺寸跟随网络环境进行变化"><a href="#2、将图片尺寸跟随网络环境进行变化" class="headerlink" title="2、将图片尺寸跟随网络环境进行变化"></a>2、将图片尺寸跟随网络环境进行变化</h3><p><strong>具体方案</strong>：不同网络环境（Wifi&#x2F;4G&#x2F;3G）下，加载不同尺寸和像素的图片，通过在图片 URL 中添加参数来改变。</p>
<p>图片 url 举例1：（图片的原始url链接）</p>
<pre class="highlight"><span class="line">https://img12.360buyimg.com/img/s3866x3866_jfs/t1/149913/14/18648/719436/5fd8b9b5Eb697b825/7c23f3028aff8e2b.jpg</span><br></pre>

<p>图片 url 举例2：（通过图片的url参数，将这张图的尺寸设置为200px）</p>
<pre class="highlight"><span class="line">https://img12.360buyimg.com/img/s200x200_jfs/t1/149913/14/18648/719436/5fd8b9b5Eb697b825/7c23f3028aff8e2b.jpg</span><br></pre>

<h3 id="3、响应式图片"><a href="#3、响应式图片" class="headerlink" title="3、响应式图片"></a>3、响应式图片</h3><p><strong>方法1</strong>：通过 JavaScript 绑定事件，检测窗口大小，以此设置图片大小。</p>
<p><strong>方法2</strong>：CSS媒体查询。</p>
<p>代码举例：（在 640px的窗口大小里，设置图片的尺寸为640px）</p>
<pre class="highlight"><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>:<span class="number">640px</span>) &#123;</span><br><span class="line">  my_image&#123;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">640px</span>;</span><br><span class="line">   &#125;</span><br><span class="line"> &#125;</span><br></pre>

<p><strong>方法3</strong>：img标签的 <code>srcset</code> 属性。这个是 H5的新特性。</p>
<p>代码举例：</p>
<pre class="highlight"><span class="line"><span class="tag">&lt;<span class="name">img</span> <span class="attr">srcset</span>=<span class="string">&quot;img-320w.jpg, img-640w.jpg 2x, img-960w.jpg 3x&quot;</span> <span class="attr">src</span>=<span class="string">“img-960w.jpg”</span></span></span><br><span class="line"><span class="tag"><span class="attr">alt</span>=<span class="string">“img”</span>&gt;</span> （x 描述符：表示图像的设备像素）</span><br></pre>

<h3 id="4、逐步加载图像：lazyload、LQIP、LQIP"><a href="#4、逐步加载图像：lazyload、LQIP、LQIP" class="headerlink" title="4、逐步加载图像：lazyload、LQIP、LQIP"></a>4、逐步加载图像：lazyload、LQIP、LQIP</h3><p><strong>方法1</strong>、使用统一占位符。俗称图片的<code>懒加载（lazyload）</code>。</p>
<p><strong>方法2</strong>、使用 <strong>LQIP</strong> 的图片加载方式。也就是说，在大图没有完全加载出来的情况下，先这张图对应的的低质量图片进行占位。</p>
<p>LQIP（Low Quality Image Placeholders）：低质量图像占位符。这种技术背后的想法是，在网络环境较差的情况下，你可以尽快向用户展示完全可用的网页，为他们提供更好的体验。即使在更好的网络连接上，这仍然为用户提供了更快的可用页面，并且改善了体验。</p>
<ul>
<li><p>安装 LQIP 工具：<code>npm install lqip</code></p>
</li>
<li><p>GitHub源码：<a target="_blank" rel="noopener" href="https://github.com/zouhir/lqip-loader">https://github.com/zouhir/lqip-loader</a></p>
</li>
</ul>
<p>代码举例：（将目标图片转换为 LQIP 形式的图）</p>
<pre class="highlight"><span class="line"><span class="keyword">const</span> lqip = <span class="built_in">require</span>(<span class="string">&#x27;lqip&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//文件路径</span></span><br><span class="line"><span class="keyword">const</span> file = <span class="string">&#x27;./in.png&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//将输入的图片转为base64</span></span><br><span class="line">lqip.<span class="title function_">base64</span>(file).<span class="title function_">then</span>(<span class="function"><span class="params">res</span> =&gt;</span> &#123;</span><br><span class="line">    <span class="comment">// 色值</span></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(res);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">lqip.<span class="title function_">palette</span>(file).<span class="title function_">then</span>(<span class="function"><span class="params">res</span> =&gt;</span> &#123;</span><br><span class="line">    <span class="comment">//这里输出的是base64的图片地址</span></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(res);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br></pre>

<p>另外，我们还可以使用 <strong>SQIP</strong> 的图片加载方式。</p>
<p>SQIP（SVG Quality Image Placeholders）： SVG 格式的图像占位符。</p>
<ul>
<li><p>安装  SQIP 工具：<code>npm install sqip</code></p>
</li>
<li><p>GitHub 源码：<a target="_blank" rel="noopener" href="https://github.com/axe312ger/sqip">https://github.com/axe312ger/sqip</a></p>
</li>
</ul>
<p>代码举例：（将目标图片转换为 SQIP 形式的图）</p>
<pre class="highlight"><span class="line"><span class="keyword">const</span> sqip = <span class="built_in">require</span>(<span class="string">&#x27;sqip&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> result =  <span class="title function_">sqip</span>(&#123;</span><br><span class="line">    <span class="attr">filename</span>: <span class="string">&#x27;./input_file.png&#x27;</span>,</span><br><span class="line">    <span class="attr">numberOfPrimitives</span>: <span class="number">10</span> <span class="comment">//可根据不同应用场景设置大小</span></span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(result.<span class="property">final_svg</span>);</span><br></pre>

<h3 id="5、雪碧图（Image-spriting）"><a href="#5、雪碧图（Image-spriting）" class="headerlink" title="5、雪碧图（Image spriting）"></a>5、雪碧图（Image spriting）</h3><p>雪碧图是比较常见的图片优化方式，也就是把多张小图合并成一张大图。这样的话，就只需做一次网络请求，减少图片的 http 请求次数。</p>
<p>读者们可以自行查阅。</p>
<h3 id="6、有些场景下，并不需要图片文件"><a href="#6、有些场景下，并不需要图片文件" class="headerlink" title="6、有些场景下，并不需要图片文件"></a>6、有些场景下，并不需要图片文件</h3><p>有些场景下，并不需要图片，我们可以用其他的方式来代替图片。</p>
<p>举例：</p>
<ul>
<li><p>Web Font 代替图片</p>
</li>
<li><p>使用 Data URI 代替图片。base64就是属于 Data URI的方式。</p>
</li>
</ul>
<h3 id="7、在服务器端进行图片自动优化"><a href="#7、在服务器端进行图片自动优化" class="headerlink" title="7、在服务器端进行图片自动优化"></a>7、在服务器端进行图片自动优化</h3><p>图片服务器自动化优化是可以在图片 URL 链接上增加不同特殊参数，服务器自动化生成。通过这些参数，可以设置图片的不同格式、大小、质量。</p>
<p><strong>常见处理方式</strong>：</p>
<ul>
<li><p>图片裁剪：按长边、短边、填充、拉伸等缩放。</p>
</li>
<li><p>图片格式转换：支持 JPG，GIF，PNG，WebP 等，支持不同的图片压缩率。</p>
</li>
<li><p>图片处理：添加图片水印、高斯模糊、重心处理、裁剪边框等。</p>
</li>
<li><p>AI 能力：鉴黄、涉政、智能抠图、智能排版、智能配色、智能合成等 AI 功能。</p>
</li>
</ul>
<p><strong>图片举例</strong>：</p>
<p>比如JD公司的图片链接，就会在服务器端做优化处理。通过修改图片链接中的参数，就能自动达到相应的优化效果。</p>
<p>原始图片链接：</p>
<pre class="highlight"><span class="line">https://img12.360buyimg.com/img/s3866x3866_jfs/t1/149913/14/18648/719436/5fd8b9b5Eb697b825/7c23f3028aff8e2b.jpg</span><br></pre>

<p>将图片压缩为 200*150：</p>
<pre class="highlight"><span class="line">https://img12.360buyimg.com/img/s200x200_jfs/t1/149913/14/18648/719436/5fd8b9b5Eb697b825/7c23f3028aff8e2b.jpg</span><br></pre>

<p>将图片转换为 webp 格式：</p>
<pre class="highlight"><span class="line">https://img12.360buyimg.com/img/s200x200_jfs/t1/149913/14/18648/719436/5fd8b9b5Eb697b825/7c23f3028aff8e2b.webp</span><br></pre>

<p>将图片质量压缩至10%：</p>
<pre class="highlight"><span class="line">https://img12.360buyimg.com/img/s3866x3866_jfs/t1/149913/14/18648/719436/5fd8b9b5Eb697b825/7c23f3028aff8e2b.jpg.q10</span><br></pre>


<h2 id="HTML优化"><a href="#HTML优化" class="headerlink" title="HTML优化"></a>HTML优化</h2><h3 id="1、精简-HTML-代码"><a href="#1、精简-HTML-代码" class="headerlink" title="1、精简 HTML 代码"></a>1、精简 HTML 代码</h3><ul>
<li><p>减少 HTML 的嵌套。</p>
</li>
<li><p>减少 DOM 节点数。</p>
</li>
<li><p>减少无语义代码（比如: <div class=“clear”></div> 消除浮动，其实可以用css来处理）。</p>
</li>
<li><p>删除 http 或者 https：如果URL的协议头和当前页面的协议头一致的，或者此 URL 在多个协议头都是可用的，则可以考虑删除协议头。</p>
</li>
<li><p>删除多余的空格、换行符、缩进和不必要的注释。</p>
</li>
<li><p>省略冗余标签和属性。</p>
</li>
<li><p>使用相对路径的 URL。</p>
</li>
</ul>
<h3 id="2、文件放在合适位置"><a href="#2、文件放在合适位置" class="headerlink" title="2、文件放在合适位置"></a>2、文件放在合适位置</h3><ul>
<li>CSS 样式文件链接尽量放在页面头部。</li>
</ul>
<p>CSS 加载不会阻塞 DOM tree 解析，但是会阻塞 DOM Tree 渲染，也会阻塞后面 JS 执行。</p>
<p>任何 body 元素之前，可以确保在文档部分中解析了所有 CSS 样式（内联和外联），从而减少了浏览器必须重排文档的次数。</p>
<p>如果放置页面底部，就要等待最后一个 CSS 文件下载完成，此时会出现”白屏”，影响用户体验。</p>
<ul>
<li>JS 引用放在 HTML 底部</li>
</ul>
<p>防止 JS 在加载、解析、执行时，阻塞了页面后续元素的正常渲染。</p>
<h3 id="4、增强用户体验"><a href="#4、增强用户体验" class="headerlink" title="4、增强用户体验"></a>4、增强用户体验</h3><ul>
<li>设置 favicon.ico</li>
</ul>
<p>网站如果不设置 favicon.ico，控制台会报错。另外页面加载过程中如果没有图标，则会出现 loading 过程，也不利于记忆网站品牌，建议统一添加。</p>
<ul>
<li>增加首屏必要的 CSS 和 JS</li>
</ul>
<p>页面如果需要等待所的依赖的 JS 和 CSS 加载完成才显示，则在渲染过程中页面会一直显示空白，影响用户体验，建议在首屏增加必要的 CSS 和 JS，比如页面框架背景图片或者loading 图标，内联在 HTML 页面中。这样做，首屏能快速显示出来，缓解用户焦虑。现在很多网页在初始化的时候，流行做<strong>骨架屏</strong>，小伙伴们也可以研究下。</p>
<h2 id="CSS优化"><a href="#CSS优化" class="headerlink" title="CSS优化"></a>CSS优化</h2><h3 id="1、提升-CSS-渲染性能"><a href="#1、提升-CSS-渲染性能" class="headerlink" title="1、提升 CSS 渲染性能"></a>1、提升 CSS 渲染性能</h3><ul>
<li><p>谨慎使用 expensive 属性，这类属性比较耗浏览器的性能。比如：<code>nth-child</code> 伪类；<code>position: fixed</code> 定位。</p>
</li>
<li><p>尽量减少样式的层级数。</p>
</li>
</ul>
<p>比如：<code>div ul li span i &#123;color: blue;&#125;</code>这样的层级就太深了。建议给 i 标签设置 class属性，然后通过class直接设置样式属性，可以提升浏览器的查询效率。</p>
<ul>
<li><p>尽量避免使用占用过多 CPU 和内存的属性。比如：<code>text-indnt:-99999px</code>。</p>
</li>
<li><p>尽量少使用耗电量大的属性。比如：CSS3 3D transforms、CSS3 transitions、Opacity 这样的属性会消耗GPU。</p>
</li>
</ul>
<h3 id="2、合适使用-CSS-选择器"><a href="#2、合适使用-CSS-选择器" class="headerlink" title="2、合适使用 CSS 选择器"></a>2、合适使用 CSS 选择器</h3><ul>
<li>尽量避免使用 CSS 表达式。</li>
</ul>
<p>比如 <code>background-color: expression( (new Date()).getHours()%2 ? &quot;#FFF&quot; : &quot;#000&quot; );</code>这个属性的意思是，每间隔两小时，改变白景色。</p>
<ul>
<li>尽量避免使用通配选择器。</li>
</ul>
<p>比如 <code>body &gt; a &#123;font-weight:blod;&#125;</code>这样的属性，可能会把 body 里所有的标签遍历一遍，才找到 a 标签，比较耗时。</p>
<ul>
<li>尽量避免类正则的属性选择器：<code>*=， |=， ^=， $=</code></li>
</ul>
<h3 id="3、提升-CSS-文件加载性能"><a href="#3、提升-CSS-文件加载性能" class="headerlink" title="3、提升 CSS 文件加载性能"></a>3、提升 CSS 文件加载性能</h3><ul>
<li>使用外链的 CSS。</li>
</ul>
<p>我们知道，内联的 css 是在html 内部写的。相比之下，外链的 CSS文件是放在CDN上的，可以缓存，既能减少 html 页面的体积大小，也能利用缓存减少资源的请求。</p>
<ul>
<li>尽量避免使用 @import 方法</li>
</ul>
<p>整个CSS加载完成后，浏览器会把 import 中所有依赖的文件全部加载完成后，浏览器才会接着往下渲染。这个过程会阻塞CSS文件的加载过程。</p>
<h3 id="4、精简-CSS-代码"><a href="#4、精简-CSS-代码" class="headerlink" title="4、精简 CSS 代码"></a>4、精简 CSS 代码</h3><ul>
<li><p>使用缩写语句</p>
</li>
<li><p>删除不必要的零。比如 0.2 可以写成 .2</p>
</li>
<li><p>删除不必要的单位，比如 0px 可以写成 0</p>
</li>
<li><p>删除过多的空格；注释言简意赅</p>
</li>
<li><p>尽量减少样式表的大小</p>
</li>
</ul>
<p>当然，很多地方可以在编译时，通过压缩工具来处理；但是我们在写代码时，也应该有良好的编码习惯。</p>
<h3 id="5、合理使用-Web-Fonts"><a href="#5、合理使用-Web-Fonts" class="headerlink" title="5、合理使用 Web Fonts"></a>5、合理使用 Web Fonts</h3><ul>
<li><p>将字体文件部署在 CDN 上。</p>
</li>
<li><p>或者将字体以 base64 形式保存在 CSS 中并通过 localStorage 进行缓存</p>
</li>
<li><p>Google 字体库因为某些不可抗拒原因，应该使用国内托管服务</p>
</li>
</ul>
<h3 id="6、CSS-动画优化"><a href="#6、CSS-动画优化" class="headerlink" title="6、CSS 动画优化"></a>6、CSS 动画优化</h3><ul>
<li><p>尽量避免同时出现过多动画。</p>
</li>
<li><p>延迟动画初始化：让其他的重要的CSS样式优先渲染。</p>
</li>
<li><p>结合 SVG。</p>
</li>
</ul>
<h2 id="JavaScript-总体优化"><a href="#JavaScript-总体优化" class="headerlink" title="JavaScript 总体优化"></a>JavaScript 总体优化</h2><h3 id="提升-JavaScript-文件加载性能"><a href="#提升-JavaScript-文件加载性能" class="headerlink" title="提升 JavaScript 文件加载性能"></a>提升 JavaScript 文件加载性能</h3><p>加载元素的顺序 CSS 文件放在 <head> 里， JavaScript 文件放在 <body> 里。</p>
<h3 id="JavaScript-变量和函数优化"><a href="#JavaScript-变量和函数优化" class="headerlink" title="JavaScript 变量和函数优化"></a>JavaScript 变量和函数优化</h3><ul>
<li><p>尽量使用 id 选择器</p>
</li>
<li><p>尽量避免使用 eval</p>
</li>
<li><p>JavaScript 函数尽可能保持简洁</p>
</li>
<li><p>使用事件节流函数</p>
</li>
<li><p>使用事件委托</p>
</li>
</ul>
<h3 id="JavaScript-动画优化"><a href="#JavaScript-动画优化" class="headerlink" title="JavaScript 动画优化"></a>JavaScript 动画优化</h3><ul>
<li><p>避免添加大量 JavaScript 动画</p>
</li>
<li><p>尽量使用 CSS3 动画</p>
</li>
<li><p>尽量使用 Canvas 动画</p>
</li>
<li><p>合理使用 requestAnimationFrame 动画代替 setTimeout、setInterval</p>
</li>
<li><p>requestAnimationFrame可以在正确的时间进行渲染，setTimeout（callback）和setInterval（callback）无法保证 callback 回调函数的执行时机。</p>
</li>
</ul>
<h3 id="合理使用缓存"><a href="#合理使用缓存" class="headerlink" title="合理使用缓存"></a>合理使用缓存</h3><ul>
<li><p>合理缓存 DOM 对象</p>
</li>
<li><p>缓存列表长度</p>
</li>
<li><p>使用可缓存的 Ajax</p>
</li>
</ul>
<h2 id="JavaScript-缓存优化"><a href="#JavaScript-缓存优化" class="headerlink" title="JavaScript 缓存优化"></a>JavaScript 缓存优化</h2><h3 id="Cookie"><a href="#Cookie" class="headerlink" title="Cookie"></a>Cookie</h3><p>通常由浏览器存储，然后将 Cookie 与每个后续请求一起发送到同一服务器。收到HTTP 请求时，服务器可以发送带有 Cookie 的 header 头。可以给 Cookie 设置有效时间。</p>
<p>应用：</p>
<ul>
<li><p>会话管理：登录名，购物车商品，游戏得分或服务器应要记录的其他任何内容</p>
</li>
<li><p>个性化：用户首选项，主题或其他设置</p>
</li>
<li><p>跟踪：记录和分析用户行为，比如visitkey</p>
</li>
</ul>
<h3 id="sessionStorage"><a href="#sessionStorage" class="headerlink" title="sessionStorage"></a>sessionStorage</h3><p>创建一个本地存储的键&#x2F;值对。</p>
<p>应用：</p>
<ul>
<li><p>缓存。</p>
</li>
<li><p>页面应用页面之间传值。</p>
</li>
</ul>
<h3 id="LocalStorage"><a href="#LocalStorage" class="headerlink" title="LocalStorage"></a>LocalStorage</h3><p>本地存储。</p>
<p>应用于：</p>
<ul>
<li><p>缓存静态文件内容 JavaScript &#x2F;CSS（比如百度M站首页）</p>
</li>
<li><p>缓存不常变更的 API 接口数据</p>
</li>
<li><p>储存地理位置信息</p>
</li>
<li><p>浏览在页面的具体位置</p>
</li>
</ul>
<h3 id="IndexedDB"><a href="#IndexedDB" class="headerlink" title="IndexedDB"></a>IndexedDB</h3><p>索引数据库。</p>
<p>应用：</p>
<ul>
<li><p>客户端存储大量结构化数据</p>
</li>
<li><p>没有网络连接的情况下使用（比如 Google Doc、石墨文档）</p>
</li>
<li><p>将冗余、很少修改、但经常访问的数据，以避免随时从服务器获取数据</p>
</li>
</ul>
<h2 id="JavaScript-模块化加载方案和选型"><a href="#JavaScript-模块化加载方案和选型" class="headerlink" title="JavaScript 模块化加载方案和选型"></a>JavaScript 模块化加载方案和选型</h2><ul>
<li>CommonJS</li>
</ul>
<p>旨在 Web 浏览器之外为 JavaScript 建立模块生态系统。Node.js 模块化方案受 CommonJS。</p>
<ul>
<li>AMD (Asynchronous Module Definition)（异步模块定义）规范。</li>
</ul>
<p>RequireJS 模块化加载器：基于 AMD API 实现。</p>
<ul>
<li>CMD（ Common Module Definition）（通用模块定义）规范。</li>
</ul>
<p>SeaJS 模块化加载器：遵循 CMD API 编写。</p>
<ul>
<li>ES6 import。</li>
</ul>
<h2 id="减少回流和重绘重要举措"><a href="#减少回流和重绘重要举措" class="headerlink" title="减少回流和重绘重要举措"></a>减少回流和重绘重要举措</h2><h3 id="CSS"><a href="#CSS" class="headerlink" title="CSS"></a>CSS</h3><ul>
<li><p>避免过多样式嵌套</p>
</li>
<li><p>避免使用 CSS 表达式</p>
</li>
<li><p>使用绝对定位，可以让动画元素脱离文档流</p>
</li>
<li><p>避免使用 table 布局</p>
</li>
<li><p>尽量不使用 float 布局</p>
</li>
<li><p>图片最好设置好 width 和 height</p>
</li>
<li><p>尽量简化浏览器不必要的任务，减少页面重新布局</p>
</li>
<li><p>使用 Viewport 设置屏幕缩放级别</p>
</li>
<li><p>避免频繁设置样式，最好把新 style 属性设置完成后，进行一次性更改</p>
</li>
<li><p>避免使用引起回流&#x2F;重绘的属性，最好把相应变量缓存起来</p>
</li>
</ul>
<h3 id="JavaScript"><a href="#JavaScript" class="headerlink" title="JavaScript"></a>JavaScript</h3><ul>
<li><p>最小化回流和重排：为了减少回流发生次数，避免频繁或操作 DOM，可以合并多次对 DOM 修改，然后一次性批量处理。</p>
</li>
<li><p>控制绘制过程和绘制区域：绘制过程开销比较大的属性设置应该尽量避免减少使用；同时，减少绘制区域范围。</p>
</li>
</ul>
<h2 id="DOM-编程优化的⽅式方法"><a href="#DOM-编程优化的⽅式方法" class="headerlink" title="DOM 编程优化的⽅式方法"></a>DOM 编程优化的⽅式方法</h2><h3 id="控制-DOM-大小"><a href="#控制-DOM-大小" class="headerlink" title="控制 DOM 大小"></a>控制 DOM 大小</h3><p>众所周知，页面交互卡顿和流畅度很大一部分原因就是页面有大量 DOM 元素。想象一下，从一个上万节点的 DOM 树上，使用 querySelectorAll 或 getElementByTagName 方法查找某一个节点，是非常耗时的。另外元素绑定事件，事件冒泡和事件捕获的执行也会相对耗时。</p>
<p>通常控制 DOM 大小的技巧包括：</p>
<ul>
<li><p>合理的业务逻辑</p>
</li>
<li><p>延迟加载即将呈现的内容</p>
</li>
</ul>
<h3 id="简化-DOM-操作"><a href="#简化-DOM-操作" class="headerlink" title="简化 DOM 操作"></a>简化 DOM 操作</h3><p>对DOM节点的操作统一处理后，再统一插入到 DOM Tree中。</p>
<p>可以使用 fragment，尽量不在页面 DOM Tree 里直接操作。</p>
<p>现在流行的框架 Angular、React、Vue 都在使用虚拟 DOM 技术，通过 diff 算法简化和减少 DOM 操作。</p>
<h2 id="静态文件压缩工具介绍"><a href="#静态文件压缩工具介绍" class="headerlink" title="静态文件压缩工具介绍"></a>静态文件压缩工具介绍</h2><p>HTML 压缩工具：</p>
<ul>
<li>html-minifier：<a target="_blank" rel="noopener" href="https://www.npmjs.com/package/html-minifier">https://www.npmjs.com/package/html-minifier</a></li>
</ul>
<p>CSS 压缩工具：</p>
<ul>
<li>clean-css：<a target="_blank" rel="noopener" href="https://www.npmjs.com/package/clean-css">https://www.npmjs.com/package/clean-css</a></li>
</ul>
<p>JavaScript 压缩工具：</p>
<ul>
<li><p>uglify-js：<a target="_blank" rel="noopener" href="https://www.npmjs.com/package/uglify-js">https://www.npmjs.com/package/uglify-js</a></p>
</li>
<li><p>使用方法：uglifyjs in.js -o out.js</p>
</li>
</ul>
<h2 id="静态⽂文件打包⽅方案"><a href="#静态⽂文件打包⽅方案" class="headerlink" title="静态⽂文件打包⽅方案"></a>静态⽂文件打包⽅方案</h2><ul>
<li><p>公共组件拆分</p>
</li>
<li><p>压缩： JavaScript &#x2F;CSS&#x2F;图片</p>
</li>
<li><p>合并： JavaScript &#x2F;CSS 文件合并，CSS Sprite</p>
</li>
<li><p>Combo： JavaScript &#x2F;CSS 文件</p>
</li>
</ul>
<h2 id="静态⽂文件版本号更新策略"><a href="#静态⽂文件版本号更新策略" class="headerlink" title="静态⽂文件版本号更新策略"></a>静态⽂文件版本号更新策略</h2><p>缓存更新：CDN 或 ng 后台刷新文件路径，更新文件header头。</p>
<p>文件 name.v1-v100.js：</p>
<ul>
<li><p>大功能迭代每次新增一个大版本，比如由 v1 到 v2</p>
</li>
<li><p>小功能迭代新增加 0.0.1 或者 0.1.0，比如从 v1.0.0 至 v1.0.1</p>
</li>
<li><p>年末 ng 统一配置所有版本 302 至最新版</p>
</li>
</ul>
<p>时间戳.文件 name.js：以每次上线时间点做差异。</p>
<p>hash.文件。以文件内容 hash 值做 key。</p>
<h2 id="前端构建工具介绍和选型建议"><a href="#前端构建工具介绍和选型建议" class="headerlink" title="前端构建工具介绍和选型建议"></a>前端构建工具介绍和选型建议</h2><h3 id="常用构建工具"><a href="#常用构建工具" class="headerlink" title="常用构建工具"></a>常用构建工具</h3><ul>
<li><p>Gulp：通过流（Stream）来简化多个任务间的配置和输出，配置代码相对较少。</p>
</li>
<li><p>Webpack：预编译，中间文件在内存中处理，支持多种模块化，配置相对很简单。</p>
</li>
<li><p>FIS</p>
</li>
</ul>
<h3 id="webpack-打包优化"><a href="#webpack-打包优化" class="headerlink" title="webpack 打包优化"></a>webpack 打包优化</h3><ul>
<li><p>定位体积大的模块</p>
</li>
<li><p>删除没有使用的依赖</p>
</li>
<li><p>生产模式进行公共依赖包抽离</p>
</li>
<li><p>开发模式进行 DLL &amp; DllReference 方式优化</p>
</li>
</ul>

  </div>
  <div>
    
      <div 
        class="post-note note-warning copyright" 
        style="margin-top: 42px">
        <p>
          <span style="font-weight: bold;">作者：</span><a 
            target="_blank" 
            rel="nofollow noopener noreferrer" 
            href="/about">
            zwl5670
          </a>
        </p>
        <p>
          <span style="font-weight: bold;">文章链接：</span><a 
            target="_blank" 
            rel="nofollow noopener noreferrer" 
            href="https://zwl5670.gitee.io/2014/08/01/14-%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/04-%E9%9D%99%E6%80%81%E8%B5%84%E6%BA%90%E4%BC%98%E5%8C%96/">
            https://zwl5670.gitee.io/2014/08/01/14-%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/04-%E9%9D%99%E6%80%81%E8%B5%84%E6%BA%90%E4%BC%98%E5%8C%96/
          </a>
        </p>
        <p><span style="font-weight: bold;">版权声明：</span>本博客所有文章除特别声明外，均采用<a target="_blank" rel="noopener" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">CC BY-NC-SA 4.0 协议</a>。转载请注明出处！</p>
      </div>
    
  </div>
</article>
<div class="nav">
  
    <div class="nav-item-prev">
      <a 
        href="/2014/08/01/14-%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/02-%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%B2%E6%9F%93%E6%9C%BA%E5%88%B6/" 
        class="nav-link">
        <i class="iconfont icon-left nav-prev-icon"></i>
        <div>
          <div class="nav-label">上一篇</div>
          
            <div class="nav-title">02-浏览器渲染机制 </div>
          
        </div>
      </a>
    </div>
  
  
    <div class="nav-item-next">
      <a 
        href="/2014/08/01/14-%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/lazyload&amp;%E9%98%B2%E6%8A%96%E5%8A%A8%E5%92%8C%E8%8A%82%E6%B5%81%E9%98%80/" 
        class="nav-link">
        <div>
          <div class="nav-label">下一篇</div>
          
            <div class="nav-title">06-lazyload&amp;防抖动和节流阀 </div>
          
        </div>
        <i class="iconfont icon-right nav-next-icon"></i>
      </a>
    </div>
  
</div>

<div 
  class="card card-content toc-card" 
  id="mobiletoc">
  <div class="toc-header">
  <i 
    class="iconfont icon-menu" 
    style="padding-right: 2px;">
  </i>目录
</div>
<ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F%E5%92%8C%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF"><span class="toc-text">图片格式和应用场景</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#JPEG-%E6%A0%BC%E5%BC%8F"><span class="toc-text">JPEG 格式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#PNG-%E6%A0%BC%E5%BC%8F"><span class="toc-text">PNG 格式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#GIF-%E6%A0%BC%E5%BC%8F"><span class="toc-text">GIF 格式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Webp-%E6%A0%BC%E5%BC%8F"><span class="toc-text">Webp 格式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%80%BB%E7%BB%93"><span class="toc-text">总结</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%9B%BE%E7%89%87%E4%BC%98%E5%8C%96%E7%9A%84%E5%B8%B8%E8%A7%81%E6%96%B9%E6%B3%95"><span class="toc-text">图片优化的常见方法</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1%E3%80%81%E7%94%A8%E5%B7%A5%E5%85%B7%E5%8E%8B%E7%BC%A9%E5%9B%BE%E7%89%87"><span class="toc-text">1、用工具压缩图片</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#2%E3%80%81%E5%B0%86%E5%9B%BE%E7%89%87%E5%B0%BA%E5%AF%B8%E8%B7%9F%E9%9A%8F%E7%BD%91%E7%BB%9C%E7%8E%AF%E5%A2%83%E8%BF%9B%E8%A1%8C%E5%8F%98%E5%8C%96"><span class="toc-text">2、将图片尺寸跟随网络环境进行变化</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#3%E3%80%81%E5%93%8D%E5%BA%94%E5%BC%8F%E5%9B%BE%E7%89%87"><span class="toc-text">3、响应式图片</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#4%E3%80%81%E9%80%90%E6%AD%A5%E5%8A%A0%E8%BD%BD%E5%9B%BE%E5%83%8F%EF%BC%9Alazyload%E3%80%81LQIP%E3%80%81LQIP"><span class="toc-text">4、逐步加载图像：lazyload、LQIP、LQIP</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5%E3%80%81%E9%9B%AA%E7%A2%A7%E5%9B%BE%EF%BC%88Image-spriting%EF%BC%89"><span class="toc-text">5、雪碧图（Image spriting）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#6%E3%80%81%E6%9C%89%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8B%EF%BC%8C%E5%B9%B6%E4%B8%8D%E9%9C%80%E8%A6%81%E5%9B%BE%E7%89%87%E6%96%87%E4%BB%B6"><span class="toc-text">6、有些场景下，并不需要图片文件</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#7%E3%80%81%E5%9C%A8%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E8%BF%9B%E8%A1%8C%E5%9B%BE%E7%89%87%E8%87%AA%E5%8A%A8%E4%BC%98%E5%8C%96"><span class="toc-text">7、在服务器端进行图片自动优化</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#HTML%E4%BC%98%E5%8C%96"><span class="toc-text">HTML优化</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1%E3%80%81%E7%B2%BE%E7%AE%80-HTML-%E4%BB%A3%E7%A0%81"><span class="toc-text">1、精简 HTML 代码</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#2%E3%80%81%E6%96%87%E4%BB%B6%E6%94%BE%E5%9C%A8%E5%90%88%E9%80%82%E4%BD%8D%E7%BD%AE"><span class="toc-text">2、文件放在合适位置</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#4%E3%80%81%E5%A2%9E%E5%BC%BA%E7%94%A8%E6%88%B7%E4%BD%93%E9%AA%8C"><span class="toc-text">4、增强用户体验</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#CSS%E4%BC%98%E5%8C%96"><span class="toc-text">CSS优化</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1%E3%80%81%E6%8F%90%E5%8D%87-CSS-%E6%B8%B2%E6%9F%93%E6%80%A7%E8%83%BD"><span class="toc-text">1、提升 CSS 渲染性能</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#2%E3%80%81%E5%90%88%E9%80%82%E4%BD%BF%E7%94%A8-CSS-%E9%80%89%E6%8B%A9%E5%99%A8"><span class="toc-text">2、合适使用 CSS 选择器</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#3%E3%80%81%E6%8F%90%E5%8D%87-CSS-%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E6%80%A7%E8%83%BD"><span class="toc-text">3、提升 CSS 文件加载性能</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#4%E3%80%81%E7%B2%BE%E7%AE%80-CSS-%E4%BB%A3%E7%A0%81"><span class="toc-text">4、精简 CSS 代码</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5%E3%80%81%E5%90%88%E7%90%86%E4%BD%BF%E7%94%A8-Web-Fonts"><span class="toc-text">5、合理使用 Web Fonts</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#6%E3%80%81CSS-%E5%8A%A8%E7%94%BB%E4%BC%98%E5%8C%96"><span class="toc-text">6、CSS 动画优化</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#JavaScript-%E6%80%BB%E4%BD%93%E4%BC%98%E5%8C%96"><span class="toc-text">JavaScript 总体优化</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%8F%90%E5%8D%87-JavaScript-%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E6%80%A7%E8%83%BD"><span class="toc-text">提升 JavaScript 文件加载性能</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#JavaScript-%E5%8F%98%E9%87%8F%E5%92%8C%E5%87%BD%E6%95%B0%E4%BC%98%E5%8C%96"><span class="toc-text">JavaScript 变量和函数优化</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#JavaScript-%E5%8A%A8%E7%94%BB%E4%BC%98%E5%8C%96"><span class="toc-text">JavaScript 动画优化</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%90%88%E7%90%86%E4%BD%BF%E7%94%A8%E7%BC%93%E5%AD%98"><span class="toc-text">合理使用缓存</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#JavaScript-%E7%BC%93%E5%AD%98%E4%BC%98%E5%8C%96"><span class="toc-text">JavaScript 缓存优化</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#Cookie"><span class="toc-text">Cookie</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#sessionStorage"><span class="toc-text">sessionStorage</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#LocalStorage"><span class="toc-text">LocalStorage</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#IndexedDB"><span class="toc-text">IndexedDB</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#JavaScript-%E6%A8%A1%E5%9D%97%E5%8C%96%E5%8A%A0%E8%BD%BD%E6%96%B9%E6%A1%88%E5%92%8C%E9%80%89%E5%9E%8B"><span class="toc-text">JavaScript 模块化加载方案和选型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%87%8F%E5%B0%91%E5%9B%9E%E6%B5%81%E5%92%8C%E9%87%8D%E7%BB%98%E9%87%8D%E8%A6%81%E4%B8%BE%E6%8E%AA"><span class="toc-text">减少回流和重绘重要举措</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#CSS"><span class="toc-text">CSS</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#JavaScript"><span class="toc-text">JavaScript</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#DOM-%E7%BC%96%E7%A8%8B%E4%BC%98%E5%8C%96%E7%9A%84%E2%BD%85%E5%BC%8F%E6%96%B9%E6%B3%95"><span class="toc-text">DOM 编程优化的⽅式方法</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%8E%A7%E5%88%B6-DOM-%E5%A4%A7%E5%B0%8F"><span class="toc-text">控制 DOM 大小</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%AE%80%E5%8C%96-DOM-%E6%93%8D%E4%BD%9C"><span class="toc-text">简化 DOM 操作</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E9%9D%99%E6%80%81%E6%96%87%E4%BB%B6%E5%8E%8B%E7%BC%A9%E5%B7%A5%E5%85%B7%E4%BB%8B%E7%BB%8D"><span class="toc-text">静态文件压缩工具介绍</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E9%9D%99%E6%80%81%E2%BD%82%E6%96%87%E4%BB%B6%E6%89%93%E5%8C%85%E2%BD%85%E6%96%B9%E6%A1%88"><span class="toc-text">静态⽂文件打包⽅方案</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E9%9D%99%E6%80%81%E2%BD%82%E6%96%87%E4%BB%B6%E7%89%88%E6%9C%AC%E5%8F%B7%E6%9B%B4%E6%96%B0%E7%AD%96%E7%95%A5"><span class="toc-text">静态⽂文件版本号更新策略</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%89%8D%E7%AB%AF%E6%9E%84%E5%BB%BA%E5%B7%A5%E5%85%B7%E4%BB%8B%E7%BB%8D%E5%92%8C%E9%80%89%E5%9E%8B%E5%BB%BA%E8%AE%AE"><span class="toc-text">前端构建工具介绍和选型建议</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%B8%B8%E7%94%A8%E6%9E%84%E5%BB%BA%E5%B7%A5%E5%85%B7"><span class="toc-text">常用构建工具</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#webpack-%E6%89%93%E5%8C%85%E4%BC%98%E5%8C%96"><span class="toc-text">webpack 打包优化</span></a></li></ol></li></ol>
</div>
            </main>
            <aside class="right-column">
              <div class="sticky-widescreen">
  
  
    <article class="card card-content toc-card">
      <div class="toc-header">
  <i 
    class="iconfont icon-menu" 
    style="padding-right: 2px;">
  </i>目录
</div>
<ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F%E5%92%8C%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF"><span class="toc-text">图片格式和应用场景</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#JPEG-%E6%A0%BC%E5%BC%8F"><span class="toc-text">JPEG 格式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#PNG-%E6%A0%BC%E5%BC%8F"><span class="toc-text">PNG 格式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#GIF-%E6%A0%BC%E5%BC%8F"><span class="toc-text">GIF 格式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Webp-%E6%A0%BC%E5%BC%8F"><span class="toc-text">Webp 格式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%80%BB%E7%BB%93"><span class="toc-text">总结</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%9B%BE%E7%89%87%E4%BC%98%E5%8C%96%E7%9A%84%E5%B8%B8%E8%A7%81%E6%96%B9%E6%B3%95"><span class="toc-text">图片优化的常见方法</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1%E3%80%81%E7%94%A8%E5%B7%A5%E5%85%B7%E5%8E%8B%E7%BC%A9%E5%9B%BE%E7%89%87"><span class="toc-text">1、用工具压缩图片</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#2%E3%80%81%E5%B0%86%E5%9B%BE%E7%89%87%E5%B0%BA%E5%AF%B8%E8%B7%9F%E9%9A%8F%E7%BD%91%E7%BB%9C%E7%8E%AF%E5%A2%83%E8%BF%9B%E8%A1%8C%E5%8F%98%E5%8C%96"><span class="toc-text">2、将图片尺寸跟随网络环境进行变化</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#3%E3%80%81%E5%93%8D%E5%BA%94%E5%BC%8F%E5%9B%BE%E7%89%87"><span class="toc-text">3、响应式图片</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#4%E3%80%81%E9%80%90%E6%AD%A5%E5%8A%A0%E8%BD%BD%E5%9B%BE%E5%83%8F%EF%BC%9Alazyload%E3%80%81LQIP%E3%80%81LQIP"><span class="toc-text">4、逐步加载图像：lazyload、LQIP、LQIP</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5%E3%80%81%E9%9B%AA%E7%A2%A7%E5%9B%BE%EF%BC%88Image-spriting%EF%BC%89"><span class="toc-text">5、雪碧图（Image spriting）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#6%E3%80%81%E6%9C%89%E4%BA%9B%E5%9C%BA%E6%99%AF%E4%B8%8B%EF%BC%8C%E5%B9%B6%E4%B8%8D%E9%9C%80%E8%A6%81%E5%9B%BE%E7%89%87%E6%96%87%E4%BB%B6"><span class="toc-text">6、有些场景下，并不需要图片文件</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#7%E3%80%81%E5%9C%A8%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E8%BF%9B%E8%A1%8C%E5%9B%BE%E7%89%87%E8%87%AA%E5%8A%A8%E4%BC%98%E5%8C%96"><span class="toc-text">7、在服务器端进行图片自动优化</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#HTML%E4%BC%98%E5%8C%96"><span class="toc-text">HTML优化</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1%E3%80%81%E7%B2%BE%E7%AE%80-HTML-%E4%BB%A3%E7%A0%81"><span class="toc-text">1、精简 HTML 代码</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#2%E3%80%81%E6%96%87%E4%BB%B6%E6%94%BE%E5%9C%A8%E5%90%88%E9%80%82%E4%BD%8D%E7%BD%AE"><span class="toc-text">2、文件放在合适位置</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#4%E3%80%81%E5%A2%9E%E5%BC%BA%E7%94%A8%E6%88%B7%E4%BD%93%E9%AA%8C"><span class="toc-text">4、增强用户体验</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#CSS%E4%BC%98%E5%8C%96"><span class="toc-text">CSS优化</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1%E3%80%81%E6%8F%90%E5%8D%87-CSS-%E6%B8%B2%E6%9F%93%E6%80%A7%E8%83%BD"><span class="toc-text">1、提升 CSS 渲染性能</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#2%E3%80%81%E5%90%88%E9%80%82%E4%BD%BF%E7%94%A8-CSS-%E9%80%89%E6%8B%A9%E5%99%A8"><span class="toc-text">2、合适使用 CSS 选择器</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#3%E3%80%81%E6%8F%90%E5%8D%87-CSS-%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E6%80%A7%E8%83%BD"><span class="toc-text">3、提升 CSS 文件加载性能</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#4%E3%80%81%E7%B2%BE%E7%AE%80-CSS-%E4%BB%A3%E7%A0%81"><span class="toc-text">4、精简 CSS 代码</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5%E3%80%81%E5%90%88%E7%90%86%E4%BD%BF%E7%94%A8-Web-Fonts"><span class="toc-text">5、合理使用 Web Fonts</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#6%E3%80%81CSS-%E5%8A%A8%E7%94%BB%E4%BC%98%E5%8C%96"><span class="toc-text">6、CSS 动画优化</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#JavaScript-%E6%80%BB%E4%BD%93%E4%BC%98%E5%8C%96"><span class="toc-text">JavaScript 总体优化</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%8F%90%E5%8D%87-JavaScript-%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E6%80%A7%E8%83%BD"><span class="toc-text">提升 JavaScript 文件加载性能</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#JavaScript-%E5%8F%98%E9%87%8F%E5%92%8C%E5%87%BD%E6%95%B0%E4%BC%98%E5%8C%96"><span class="toc-text">JavaScript 变量和函数优化</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#JavaScript-%E5%8A%A8%E7%94%BB%E4%BC%98%E5%8C%96"><span class="toc-text">JavaScript 动画优化</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%90%88%E7%90%86%E4%BD%BF%E7%94%A8%E7%BC%93%E5%AD%98"><span class="toc-text">合理使用缓存</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#JavaScript-%E7%BC%93%E5%AD%98%E4%BC%98%E5%8C%96"><span class="toc-text">JavaScript 缓存优化</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#Cookie"><span class="toc-text">Cookie</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#sessionStorage"><span class="toc-text">sessionStorage</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#LocalStorage"><span class="toc-text">LocalStorage</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#IndexedDB"><span class="toc-text">IndexedDB</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#JavaScript-%E6%A8%A1%E5%9D%97%E5%8C%96%E5%8A%A0%E8%BD%BD%E6%96%B9%E6%A1%88%E5%92%8C%E9%80%89%E5%9E%8B"><span class="toc-text">JavaScript 模块化加载方案和选型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%87%8F%E5%B0%91%E5%9B%9E%E6%B5%81%E5%92%8C%E9%87%8D%E7%BB%98%E9%87%8D%E8%A6%81%E4%B8%BE%E6%8E%AA"><span class="toc-text">减少回流和重绘重要举措</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#CSS"><span class="toc-text">CSS</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#JavaScript"><span class="toc-text">JavaScript</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#DOM-%E7%BC%96%E7%A8%8B%E4%BC%98%E5%8C%96%E7%9A%84%E2%BD%85%E5%BC%8F%E6%96%B9%E6%B3%95"><span class="toc-text">DOM 编程优化的⽅式方法</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%8E%A7%E5%88%B6-DOM-%E5%A4%A7%E5%B0%8F"><span class="toc-text">控制 DOM 大小</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%AE%80%E5%8C%96-DOM-%E6%93%8D%E4%BD%9C"><span class="toc-text">简化 DOM 操作</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E9%9D%99%E6%80%81%E6%96%87%E4%BB%B6%E5%8E%8B%E7%BC%A9%E5%B7%A5%E5%85%B7%E4%BB%8B%E7%BB%8D"><span class="toc-text">静态文件压缩工具介绍</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E9%9D%99%E6%80%81%E2%BD%82%E6%96%87%E4%BB%B6%E6%89%93%E5%8C%85%E2%BD%85%E6%96%B9%E6%A1%88"><span class="toc-text">静态⽂文件打包⽅方案</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E9%9D%99%E6%80%81%E2%BD%82%E6%96%87%E4%BB%B6%E7%89%88%E6%9C%AC%E5%8F%B7%E6%9B%B4%E6%96%B0%E7%AD%96%E7%95%A5"><span class="toc-text">静态⽂文件版本号更新策略</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%89%8D%E7%AB%AF%E6%9E%84%E5%BB%BA%E5%B7%A5%E5%85%B7%E4%BB%8B%E7%BB%8D%E5%92%8C%E9%80%89%E5%9E%8B%E5%BB%BA%E8%AE%AE"><span class="toc-text">前端构建工具介绍和选型建议</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%B8%B8%E7%94%A8%E6%9E%84%E5%BB%BA%E5%B7%A5%E5%85%B7"><span class="toc-text">常用构建工具</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#webpack-%E6%89%93%E5%8C%85%E4%BC%98%E5%8C%96"><span class="toc-text">webpack 打包优化</span></a></li></ol></li></ol>
    </article>
  
  
  <article class="card card-content">
    <div class="recent-posts-card">
  <div class="recent-posts-header">
    <i 
      class="iconfont icon-wenzhang_huaban" 
      style="padding-right: 2px;">
    </i>最近文章
  </div>
  <div class="recent-posts-list">
    
      <div class="recent-posts-item">
        <div class="recent-posts-item-title">2023-03-09</div>
        <a href="/2023/03/09/13-React%E5%9F%BA%E7%A1%80/11-React%20Navive%E5%88%9D%E8%AF%86/"><div class="recent-posts-item-content">11-React Navive初识</div></a>
      </div>
    
      <div class="recent-posts-item">
        <div class="recent-posts-item-title">2023-03-09</div>
        <a href="/2023/03/09/13-React%E5%9F%BA%E7%A1%80/10-AntD%E6%A1%86%E6%9E%B6%E7%9A%84upload%E7%BB%84%E4%BB%B6%E4%B8%8A%E4%BC%A0%E5%9B%BE%E7%89%87%E6%97%B6%E4%BD%BF%E7%94%A8customRequest%E6%96%B9%E6%B3%95%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%8A%E4%BC%A0%E8%A1%8C%E4%B8%BA/"><div class="recent-posts-item-content">10-AntD框架的upload组件上传图片时使用customRequest方法自定义上传行为</div></a>
      </div>
    
      <div class="recent-posts-item">
        <div class="recent-posts-item-title">2023-03-09</div>
        <a href="/2023/03/09/13-React%E5%9F%BA%E7%A1%80/09-AntD%E6%A1%86%E6%9E%B6%E7%9A%84upload%E7%BB%84%E4%BB%B6%E4%B8%8A%E4%BC%A0%E5%9B%BE%E7%89%87%E6%97%B6%E9%81%87%E5%88%B0%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9D%91/"><div class="recent-posts-item-content">09-AntD框架的upload组件上传图片时遇到的一些坑</div></a>
      </div>
    
      <div class="recent-posts-item">
        <div class="recent-posts-item-title">2023-03-09</div>
        <a href="/2023/03/09/13-React%E5%9F%BA%E7%A1%80/08-Ant%20Design%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/"><div class="recent-posts-item-content">08-Ant Design的基本使用</div></a>
      </div>
    
  </div>
</div>
  </article>
  
  
</div>
            </aside>
          </div>
        </div>
      </div>
    </div>
     
    <footer class="footer">
  <div class="footer-container">
    <div>
      <div class="footer-dsc">
        <span>
          Copyright ©
          
            2023
          
          
        </span>
        &nbsp;
        <a 
          href="/" 
          class="footer-link">
          前端面试
        </a>
      </div>
    </div>

    
      <div class="footer-dsc">
        
          Powered by
          <a 
            href="https://hexo.io/" 
            class="footer-link" 
            target="_blank" 
            rel="nofollow noopener noreferrer">
            &nbsp;Hexo
          </a>
        
        
          <span>&nbsp;|&nbsp;</span>
        
        
          Theme -
          <a 
            href="https://github.com/theme-kaze" 
            class="footer-link" 
            target="_blank"
            rel="nofollow noopener noreferrer">
            &nbsp;Kaze
          </a>
        
      </div>
    
    
    
    
</footer>
 
    
  <a 
    role="button" 
    id="scrollbutton" 
    class="basebutton" 
    aria-label="回到顶部">
    <i class="iconfont icon-arrowleft button-icon"></i>
  </a>

<a 
  role="button" 
  id="menubutton"
  aria-label="menu button"
  class="basebutton">
  <i class="iconfont icon-menu button-icon"></i>
</a>
<a 
  role="button" 
  id="popbutton" 
  class="basebutton" 
  aria-label="控制中心">
  <i class="iconfont icon-expand button-icon"></i>
</a>
<a 
  role="button" 
  id="darkbutton" 
  class="basebutton darkwidget" 
  aria-label="夜色模式">
  <i class="iconfont icon-weather button-icon"></i>
</a>
<a 
  role="button" 
  id="searchbutton" 
  class="basebutton searchwidget" 
  aria-label="搜索">
  <i class="iconfont icon-search button-icon"></i>
</a> 
     
     
     
      <script>
  var addImgLayout = function () {
    var img = document.querySelectorAll('.post-content img')
    var i
    for (i = 0; i < img.length; i++) {
      var wrapper = document.createElement('a')
      wrapper.setAttribute('href', img[i].getAttribute('data-src'))
      wrapper.setAttribute('aria-label', 'illustration')
      wrapper.style.cssText =
        'width: 100%; display: flex; justify-content: center;'
      if (img[i].alt) wrapper.dataset.caption = img[i].alt
      wrapper.dataset.nolink = true
      img[i].before(wrapper)
      wrapper.append(img[i])
      var divWrap = document.createElement('div')
      divWrap.classList.add('gallery')
      wrapper.before(divWrap)
      divWrap.append(wrapper)
    }
    baguetteBox.run('.gallery')
  }
</script>
<script>
  loadScript(
    "/js/lib/lightbox/baguetteBox.min.js",
    addImgLayout
  )
</script>
 
     
     
    <script src="/js/main.js"></script> 
     
    
      <script>
        var addLazyload = function () {
          var observer = lozad('.lozad', {
            load: function (el) {
              el.srcset = el.getAttribute('data-src')
            },
            loaded: function (el) {
              el.classList.add('loaded')
            },
          })
          observer.observe()
        }
      </script>
      <script>
        loadScript('/js/lib/lozad.min.js', addLazyload)
      </script>
    
    <script src="//instant.page/5.1.0" type="module"
      integrity="sha384-by67kQnR+pyfy8yWP4kPO12fHKRLHZPfEsiSXR8u2IKcTdxD805MGUXBzVPnkLHw"></script>
    
    
  </body>
</html>
